跳轉到

pytest 學習指南(進階篇)

接下來的教學中,我們將討論 pytest 的進階功能。我們首先設置了一個簡單的項目架構,pytest-ch2 專案包含一個 libs 資料夾,裡面有一個 module.py 檔案,以及一個 tests 資料夾,用來放置測試檔案 test_module.py。

專案結構如下:

pytest-ch2
│
├─libs
│      module.py
│
└─tests
       test_module.py

建立一個結構化的測試專案

假設 libs/module.py 包含一個簡單的函數,例如:

# libs/module.py
def add(a, b):
    return a + b

接著在 tests/test_module.py 中為這個 add 函數撰寫單元測試。

# tests/test_module.py
import pytest
from libs.module import add

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (0, 0, 0),
    (-1, -1, -2),
    (-1, 2, 1)
])
def test_add(a, b, expected):
    assert add(a, b) == expected

建立專案設定檔

由於我們會匯入其他資料夾中的功能,如果沒有正確配置專案路徑,可能會遇到 ModuleNotFoundError,無法找到對應的模組。為了解決這個問題,我們可以建立一個設定檔,告訴 pytest 應該搜尋的路徑。你可以在專案的根目錄下建立 pytest.ini 檔案,並加入以下內容:

[pytest]
pythonpath = .

執行測試

在專案的根目錄下執行 pytest,其中 -v 表示詳細模式,顯示每個測試案例的結果。

pytest -v

pytest.ini 的基本功能

pytest.ini 是 pytest 的配置檔案,通常用來為 pytest 測試環境設定全域的選項和參數。這個檔案的作用是讓你可以在不必每次都在命令列上指定參數的情況下,配置 pytest 的行為。

1.修改測試路徑:設定 pytest 應該從哪裡開始尋找測試檔案。 2.設定 pytest 的預設選項:可以設定如啟動 verbose 模式、設置測試的輸出格式等。 3.設定忽略的檔案:可以指定哪些檔案或資料夾應被忽略,避免 pytest 搜尋這些位置。 4.設定自訂的測試標籤:可以為測試標記不同的標籤,並根據標籤來執行測試。

基本的 pytest.ini 結構

格式很簡單,它使用類似 ini 檔案的格式。以下是一個基本範例:

[pytest]
addopts = -v --tb=short  # 設置默認選項,如 verbose 模式和簡化的 traceback 輸出
testpaths = tests  # 指定測試檔案的路徑,這裡是 tests 資料夾
python_files = test_*.py  # 指定 pytest 搜索的測試檔案名稱模式
python_classes = Test*  # 指定 pytest 搜索的測試類別名稱模式
python_functions = test_*  # 指定 pytest 搜索的測試函數名稱模式
markers = 
    slow: 測試運行較慢的標記
    integration: 集成測試標記

pytest.ini 的常見設置選項

1.addopts

這個選項允許你在運行 pytest 時添加默認的選項。例如,-v 用來開啟詳細模式,--tb=short 用來簡化錯誤訊息的 traceback 輸出。

addopts = -v --tb=short

2.testpaths

指定 pytest 搜索測試檔案的路徑。這可以用來告訴 pytest 只在特定資料夾下尋找測試檔案。

testpaths = tests

3.python_files

控制 pytest 應該尋找哪些檔案來進行測試。預設 pytest 會尋找檔名以 test_ 開頭或結尾的檔案。

python_files = test_*.py

4.python_classes

控制 pytest 應該搜尋哪些類別來作為測試類別。預設 pytest 會尋找名稱以 Test 開頭的類別。

python_classes = Test*

5.python_functions

控制 pytest 應該搜尋哪些函數來作為測試函數。預設 pytest 會尋找名稱以 test_ 開頭的函數。

python_functions = test_*

6.markers

自訂標記來標籤特定的測試案例,允許你根據標籤來執行測試。例如,將運行較慢的測試標記為 slow,在執行測試時,可以使用 pytest -m slow 來選擇只執行這類標記的測試。

markers = 
    slow: 測試運行較慢的標記
    integration: 集成測試標記

撰寫 pytest.ini 的技巧

1.使用自訂標記進行分類

  • 當專案規模較大時,可以使用自訂標記來將測試分類,例如標記某些測試為 "慢速測試" 或 "集成測試"。這樣你就可以根據標籤來執行測試,節省時間。

2.簡化命令行選項

  • 透過 addopts 配置,你可以設定默認選項,這樣就不需要每次都在命令列上輸入相同的選項,讓測試運行更方便。

3.調整測試路徑和命名規則

  • 如果你的專案架構不符合 pytest 的預設規則(例如,測試檔案不以 test_ 開頭),可以通過 python_filespython_functions 來定制檢測規則。